}
GskVulkanPipeline *
-gsk_vulkan_blend_pipeline_new (GskVulkanPipelineLayout *layout,
+gsk_vulkan_blend_pipeline_new (GdkVulkanContext *context,
+ VkPipelineLayout layout,
const char *shader_name,
VkRenderPass render_pass)
{
- return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_BLEND_PIPELINE, layout, shader_name, render_pass);
+ return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_BLEND_PIPELINE, context, layout, shader_name, render_pass);
}
gsize
G_DECLARE_FINAL_TYPE (GskVulkanBlendPipeline, gsk_vulkan_blend_pipeline, GSK, VULKAN_BLEND_PIPELINE, GskVulkanPipeline)
-GskVulkanPipeline * gsk_vulkan_blend_pipeline_new (GskVulkanPipelineLayout * layout,
+GskVulkanPipeline * gsk_vulkan_blend_pipeline_new (GdkVulkanContext *context,
+ VkPipelineLayout layout,
const char *shader_name,
VkRenderPass render_pass);
}
GskVulkanPipeline *
-gsk_vulkan_blur_pipeline_new (GskVulkanPipelineLayout *layout,
+gsk_vulkan_blur_pipeline_new (GdkVulkanContext *context,
+ VkPipelineLayout layout,
const char *shader_name,
VkRenderPass render_pass)
{
- return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_BLUR_PIPELINE, layout, shader_name, render_pass);
+ return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_BLUR_PIPELINE, context, layout, shader_name, render_pass);
}
gsize
G_DECLARE_FINAL_TYPE (GskVulkanBlurPipeline, gsk_vulkan_blur_pipeline, GSK, VULKAN_BLUR_PIPELINE, GskVulkanPipeline)
-GskVulkanPipeline * gsk_vulkan_blur_pipeline_new (GskVulkanPipelineLayout *layout,
+GskVulkanPipeline * gsk_vulkan_blur_pipeline_new (GdkVulkanContext *context,
+ VkPipelineLayout layout,
const char *shader_name,
VkRenderPass render_pass);
}
GskVulkanPipeline *
-gsk_vulkan_border_pipeline_new (GskVulkanPipelineLayout *layout,
- const char *shader_name,
- VkRenderPass render_pass)
+gsk_vulkan_border_pipeline_new (GdkVulkanContext *context,
+ VkPipelineLayout layout,
+ const char *shader_name,
+ VkRenderPass render_pass)
{
- return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_BORDER_PIPELINE, layout, shader_name, render_pass);
+ return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_BORDER_PIPELINE, context, layout, shader_name, render_pass);
}
gsize
G_DECLARE_FINAL_TYPE (GskVulkanBorderPipeline, gsk_vulkan_border_pipeline, GSK, VULKAN_BORDER_PIPELINE, GskVulkanPipeline)
-GskVulkanPipeline * gsk_vulkan_border_pipeline_new (GskVulkanPipelineLayout * layout,
+GskVulkanPipeline * gsk_vulkan_border_pipeline_new (GdkVulkanContext *context,
+ VkPipelineLayout layout,
const char *shader_name,
VkRenderPass render_pass);
}
GskVulkanPipeline *
-gsk_vulkan_box_shadow_pipeline_new (GskVulkanPipelineLayout *layout,
- const char *shader_name,
- VkRenderPass render_pass)
+gsk_vulkan_box_shadow_pipeline_new (GdkVulkanContext *context,
+ VkPipelineLayout layout,
+ const char *shader_name,
+ VkRenderPass render_pass)
{
- return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_BOX_SHADOW_PIPELINE, layout, shader_name, render_pass);
+ return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_BOX_SHADOW_PIPELINE, context, layout, shader_name, render_pass);
}
gsize
G_DECLARE_FINAL_TYPE (GskVulkanBoxShadowPipeline, gsk_vulkan_box_shadow_pipeline, GSK, VULKAN_BOX_SHADOW_PIPELINE, GskVulkanPipeline)
-GskVulkanPipeline * gsk_vulkan_box_shadow_pipeline_new (GskVulkanPipelineLayout * layout,
+GskVulkanPipeline * gsk_vulkan_box_shadow_pipeline_new (GdkVulkanContext *context,
+ VkPipelineLayout layout,
const char *shader_name,
VkRenderPass render_pass);
}
GskVulkanPipeline *
-gsk_vulkan_color_pipeline_new (GskVulkanPipelineLayout *layout,
+gsk_vulkan_color_pipeline_new (GdkVulkanContext *context,
+ VkPipelineLayout layout,
const char *shader_name,
VkRenderPass render_pass)
{
- return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_COLOR_PIPELINE, layout, shader_name, render_pass);
+ return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_COLOR_PIPELINE, context, layout, shader_name, render_pass);
}
gsize
G_DECLARE_FINAL_TYPE (GskVulkanColorPipeline, gsk_vulkan_color_pipeline, GSK, VULKAN_COLOR_PIPELINE, GskVulkanPipeline)
-GskVulkanPipeline * gsk_vulkan_color_pipeline_new (GskVulkanPipelineLayout * layout,
+GskVulkanPipeline * gsk_vulkan_color_pipeline_new (GdkVulkanContext *context,
+ VkPipelineLayout layout,
const char *shader_name,
VkRenderPass render_pass);
}
GskVulkanPipeline *
-gsk_vulkan_color_text_pipeline_new (GskVulkanPipelineLayout *layout,
+gsk_vulkan_color_text_pipeline_new (GdkVulkanContext *context,
+ VkPipelineLayout layout,
const char *shader_name,
VkRenderPass render_pass)
{
- return gsk_vulkan_pipeline_new_full (GSK_TYPE_VULKAN_COLOR_TEXT_PIPELINE, layout, shader_name, render_pass,
+ return gsk_vulkan_pipeline_new_full (GSK_TYPE_VULKAN_COLOR_TEXT_PIPELINE, context, layout, shader_name, render_pass,
VK_BLEND_FACTOR_SRC_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA);
}
G_DECLARE_FINAL_TYPE (GskVulkanColorTextPipeline, gsk_vulkan_color_text_pipeline, GSK, VULKAN_COLOR_TEXT_PIPELINE, GskVulkanPipeline)
-GskVulkanPipeline * gsk_vulkan_color_text_pipeline_new (GskVulkanPipelineLayout *layout,
+GskVulkanPipeline * gsk_vulkan_color_text_pipeline_new (GdkVulkanContext *context,
+ VkPipelineLayout layout,
const char *shader_name,
VkRenderPass render_pass);
}
GskVulkanPipeline *
-gsk_vulkan_effect_pipeline_new (GskVulkanPipelineLayout *layout,
+gsk_vulkan_effect_pipeline_new (GdkVulkanContext *context,
+ VkPipelineLayout layout,
const char *shader_name,
VkRenderPass render_pass)
{
- return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_EFFECT_PIPELINE, layout, shader_name, render_pass);
+ return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_EFFECT_PIPELINE, context, layout, shader_name, render_pass);
}
gsize
G_DECLARE_FINAL_TYPE (GskVulkanEffectPipeline, gsk_vulkan_effect_pipeline, GSK, VULKAN_EFFECT_PIPELINE, GskVulkanPipeline)
-GskVulkanPipeline * gsk_vulkan_effect_pipeline_new (GskVulkanPipelineLayout *layout,
+GskVulkanPipeline * gsk_vulkan_effect_pipeline_new (GdkVulkanContext *context,
+ VkPipelineLayout layout,
const char *shader_name,
VkRenderPass render_pass);
}
GskVulkanPipeline *
-gsk_vulkan_linear_gradient_pipeline_new (GskVulkanPipelineLayout *layout,
+gsk_vulkan_linear_gradient_pipeline_new (GdkVulkanContext *context,
+ VkPipelineLayout layout,
const char *shader_name,
VkRenderPass render_pass)
{
- return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_LINEAR_GRADIENT_PIPELINE, layout, shader_name, render_pass);
+ return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_LINEAR_GRADIENT_PIPELINE, context, layout, shader_name, render_pass);
}
gsize
G_DECLARE_FINAL_TYPE (GskVulkanLinearGradientPipeline, gsk_vulkan_linear_gradient_pipeline, GSK, VULKAN_LINEAR_GRADIENT_PIPELINE, GskVulkanPipeline)
-GskVulkanPipeline * gsk_vulkan_linear_gradient_pipeline_new (GskVulkanPipelineLayout * layout,
+GskVulkanPipeline * gsk_vulkan_linear_gradient_pipeline_new (GdkVulkanContext *context,
+ VkPipelineLayout layout,
const char *shader_name,
VkRenderPass render_pass);
typedef struct _GskVulkanPipelinePrivate GskVulkanPipelinePrivate;
-struct _GskVulkanPipelineLayout
-{
- volatile gint ref_count;
- GdkVulkanContext *vulkan;
-
- VkPipelineLayout pipeline_layout;
-};
-
struct _GskVulkanPipelinePrivate
{
GObject parent_instance;
- GskVulkanPipelineLayout *layout;
+ GdkVulkanContext *context;
VkPipeline pipeline;
+ VkPipelineLayout layout;
GskVulkanShader *vertex_shader;
GskVulkanShader *fragment_shader;
gsk_vulkan_pipeline_finalize (GObject *gobject)
{
GskVulkanPipelinePrivate *priv = gsk_vulkan_pipeline_get_instance_private (GSK_VULKAN_PIPELINE (gobject));
+ VkDevice device;
- VkDevice device = gdk_vulkan_context_get_device (priv->layout->vulkan);
+ device = gdk_vulkan_context_get_device (priv->context);
vkDestroyPipeline (device,
priv->pipeline,
NULL);
-
+
g_clear_pointer (&priv->fragment_shader, gsk_vulkan_shader_free);
g_clear_pointer (&priv->vertex_shader, gsk_vulkan_shader_free);
- g_clear_pointer (&priv->layout, gsk_vulkan_pipeline_layout_unref);
-
G_OBJECT_CLASS (gsk_vulkan_pipeline_parent_class)->finalize (gobject);
}
GskVulkanPipeline *
gsk_vulkan_pipeline_new (GType pipeline_type,
- GskVulkanPipelineLayout *layout,
+ GdkVulkanContext *context,
+ VkPipelineLayout layout,
const char *shader_name,
VkRenderPass render_pass)
{
- return gsk_vulkan_pipeline_new_full (pipeline_type, layout, shader_name, render_pass,
+ return gsk_vulkan_pipeline_new_full (pipeline_type, context, layout, shader_name, render_pass,
VK_BLEND_FACTOR_ONE,
VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA);
}
GskVulkanPipeline *
gsk_vulkan_pipeline_new_full (GType pipeline_type,
- GskVulkanPipelineLayout *layout,
+ GdkVulkanContext *context,
+ VkPipelineLayout layout,
const char *shader_name,
VkRenderPass render_pass,
VkBlendFactor srcBlendFactor,
{
GskVulkanPipelinePrivate *priv;
GskVulkanPipeline *self;
-
VkDevice device;
g_return_val_if_fail (g_type_is_a (pipeline_type, GSK_TYPE_VULKAN_PIPELINE), NULL);
- g_return_val_if_fail (layout != NULL, NULL);
+ g_return_val_if_fail (layout != VK_NULL_HANDLE, NULL);
g_return_val_if_fail (shader_name != NULL, NULL);
g_return_val_if_fail (render_pass != VK_NULL_HANDLE, NULL);
priv = gsk_vulkan_pipeline_get_instance_private (self);
- priv->layout = gsk_vulkan_pipeline_layout_ref (layout);
+ device = gdk_vulkan_context_get_device (context);
- device = gdk_vulkan_context_get_device (layout->vulkan);
+ priv->context = context;
+ priv->layout = layout;
- priv->vertex_shader = gsk_vulkan_shader_new_from_resource (layout->vulkan, GSK_VULKAN_SHADER_VERTEX, shader_name, NULL);
- priv->fragment_shader = gsk_vulkan_shader_new_from_resource (layout->vulkan, GSK_VULKAN_SHADER_FRAGMENT, shader_name, NULL);
+ priv->vertex_shader = gsk_vulkan_shader_new_from_resource (context, GSK_VULKAN_SHADER_VERTEX, shader_name, NULL);
+ priv->fragment_shader = gsk_vulkan_shader_new_from_resource (context, GSK_VULKAN_SHADER_FRAGMENT, shader_name, NULL);
GSK_VK_CHECK (vkCreateGraphicsPipelines, device,
VK_NULL_HANDLE,
VK_DYNAMIC_STATE_SCISSOR
},
},
- .layout = gsk_vulkan_pipeline_layout_get_pipeline_layout (priv->layout),
+ .layout = priv->layout,
.renderPass = render_pass,
.subpass = 0,
.basePipelineHandle = VK_NULL_HANDLE,
{
GskVulkanPipelinePrivate *priv = gsk_vulkan_pipeline_get_instance_private (self);
- return priv->layout->pipeline_layout;
-}
-
-/*** GskVulkanPipelineLayout ***/
-
-GskVulkanPipelineLayout *
-gsk_vulkan_pipeline_layout_new (GdkVulkanContext *context,
- guint layout_count,
- VkDescriptorSetLayout *descriptor_set_layout)
-{
- GskVulkanPipelineLayout *self;
- VkDevice device;
-
- self = g_slice_new0 (GskVulkanPipelineLayout);
- self->ref_count = 1;
- self->vulkan = g_object_ref (context);
-
- device = gdk_vulkan_context_get_device (context);
-
- GSK_VK_CHECK (vkCreatePipelineLayout, device,
- &(VkPipelineLayoutCreateInfo) {
- .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
- .setLayoutCount = layout_count,
- .pSetLayouts = descriptor_set_layout,
- .pushConstantRangeCount = gst_vulkan_push_constants_get_range_count (),
- .pPushConstantRanges = gst_vulkan_push_constants_get_ranges ()
- },
- NULL,
- &self->pipeline_layout);
-
- return self;
-}
-
-GskVulkanPipelineLayout *
-gsk_vulkan_pipeline_layout_ref (GskVulkanPipelineLayout *self)
-{
- self->ref_count++;
-
- return self;
-}
-
-void
-gsk_vulkan_pipeline_layout_unref (GskVulkanPipelineLayout *self)
-{
- VkDevice device;
-
- self->ref_count--;
-
- if (self->ref_count > 0)
- return;
-
- device = gdk_vulkan_context_get_device (self->vulkan);
-
- vkDestroyPipelineLayout (device,
- self->pipeline_layout,
- NULL);
-
- g_slice_free (GskVulkanPipelineLayout, self);
-}
-
-
-VkPipelineLayout
-gsk_vulkan_pipeline_layout_get_pipeline_layout (GskVulkanPipelineLayout *self)
-{
- return self->pipeline_layout;
+ return priv->layout;
}
G_BEGIN_DECLS
-typedef struct _GskVulkanPipelineLayout GskVulkanPipelineLayout;
-
#define GSK_TYPE_VULKAN_PIPELINE (gsk_vulkan_pipeline_get_type ())
G_DECLARE_DERIVABLE_TYPE (GskVulkanPipeline, gsk_vulkan_pipeline, GSK, VULKAN_PIPELINE, GObject)
#define GSK_VK_CHECK(func, ...) gsk_vulkan_handle_result (func (__VA_ARGS__), G_STRINGIFY (func))
-GskVulkanPipelineLayout * gsk_vulkan_pipeline_layout_new (GdkVulkanContext *context,
- guint layout_count,
- VkDescriptorSetLayout *descriptor_set_layout);
-GskVulkanPipelineLayout * gsk_vulkan_pipeline_layout_ref (GskVulkanPipelineLayout *self);
-void gsk_vulkan_pipeline_layout_unref (GskVulkanPipelineLayout *self);
-
-VkPipelineLayout gsk_vulkan_pipeline_layout_get_pipeline_layout
- (GskVulkanPipelineLayout *self);
GskVulkanPipeline * gsk_vulkan_pipeline_new (GType pipeline_type,
- GskVulkanPipelineLayout *layout,
+ GdkVulkanContext *context,
+ VkPipelineLayout layout,
const char *shader_name,
VkRenderPass render_pass);
GskVulkanPipeline * gsk_vulkan_pipeline_new_full (GType pipeline_type,
- GskVulkanPipelineLayout *layout,
+ GdkVulkanContext *context,
+ VkPipelineLayout layout,
const char *shader_name,
VkRenderPass render_pass,
VkBlendFactor srcBlendFactor,
#include "gskvulkaneffectpipelineprivate.h"
#include "gskvulkanlineargradientpipelineprivate.h"
#include "gskvulkantextpipelineprivate.h"
+#include "gskvulkanpushconstantsprivate.h"
#define ORTHO_NEAR_PLANE -10000
#define ORTHO_FAR_PLANE 10000
VkFence fence;
VkRenderPass render_pass;
VkDescriptorSetLayout descriptor_set_layout;
- GskVulkanPipelineLayout *layout[3]; /* indexed by number of textures */
+ VkPipelineLayout pipeline_layout[3]; /* indexed by number of textures */
GskVulkanUploader *uploader;
GskVulkanBuffer *vertex_buffer;
self->descriptor_set_layout,
self->descriptor_set_layout
};
- self->layout[i] = gsk_vulkan_pipeline_layout_new (self->vulkan, i, layouts);
+
+ GSK_VK_CHECK (vkCreatePipelineLayout, device,
+ &(VkPipelineLayoutCreateInfo) {
+ .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
+ .setLayoutCount = i,
+ .pSetLayouts = layouts,
+ .pushConstantRangeCount = gst_vulkan_push_constants_get_range_count (),
+ .pPushConstantRanges = gst_vulkan_push_constants_get_ranges ()
+ },
+ NULL,
+ &self->pipeline_layout[i]);
}
self->uploader = gsk_vulkan_uploader_new (self->vulkan, self->command_pool);
static const struct {
const char *name;
guint num_textures;
- GskVulkanPipeline * (* create_func) (GskVulkanPipelineLayout *layout, const char *name, VkRenderPass render_pass);
+ GskVulkanPipeline * (* create_func) (GdkVulkanContext *context, VkPipelineLayout layout, const char *name, VkRenderPass render_pass);
} pipeline_info[GSK_VULKAN_N_PIPELINES] = {
{ "blend", 1, gsk_vulkan_blend_pipeline_new },
{ "blend-clip", 1, gsk_vulkan_blend_pipeline_new },
g_return_val_if_fail (type < GSK_VULKAN_N_PIPELINES, NULL);
if (self->pipelines[type] == NULL)
- {
- self->pipelines[type] = pipeline_info[type].create_func (self->layout[pipeline_info[type].num_textures],
- pipeline_info[type].name,
- self->render_pass);
- }
+ self->pipelines[type] = pipeline_info[type].create_func (self->vulkan,
+ self->pipeline_layout[pipeline_info[type].num_textures],
+ pipeline_info[type].name,
+ self->render_pass);
return self->pipelines[type];
}
for (l = self->render_passes; l; l = l->next)
{
- gsk_vulkan_render_pass_draw (l->data, self, self->vertex_buffer, 3, self->layout, command_buffer);
+ gsk_vulkan_render_pass_draw (l->data, self, self->vertex_buffer, 3, self->pipeline_layout, command_buffer);
}
vkCmdEndRenderPass (command_buffer);
g_clear_pointer (&self->uploader, gsk_vulkan_uploader_free);
for (i = 0; i < 3; i++)
- g_clear_pointer (&self->layout[i], gsk_vulkan_pipeline_layout_unref);
+ vkDestroyPipelineLayout (device,
+ self->pipeline_layout[i],
+ NULL);
vkDestroyRenderPass (device,
self->render_pass,
GskVulkanRender *render,
GskVulkanBuffer *vertex_buffer,
guint layout_count,
- GskVulkanPipelineLayout **layout,
+ VkPipelineLayout *pipeline_layout,
VkCommandBuffer command_buffer)
{
GskVulkanPipeline *current_pipeline = NULL;
case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS:
for (int i = 0; i < layout_count; i++)
gsk_vulkan_push_constants_push (&op->constants.constants,
- command_buffer,
- gsk_vulkan_pipeline_layout_get_pipeline_layout (layout[i]));
+ command_buffer,
+ pipeline_layout[i]);
break;
default:
GskVulkanRender *render,
GskVulkanBuffer *vertex_buffer,
guint layout_count,
- GskVulkanPipelineLayout **layout,
+ VkPipelineLayout *pipeline_layout,
VkCommandBuffer command_buffer);
G_END_DECLS
}
GskVulkanPipeline *
-gsk_vulkan_text_pipeline_new (GskVulkanPipelineLayout *layout,
- const char *shader_name,
- VkRenderPass render_pass)
+gsk_vulkan_text_pipeline_new (GdkVulkanContext *context,
+ VkPipelineLayout layout,
+ const char *shader_name,
+ VkRenderPass render_pass)
{
- return gsk_vulkan_pipeline_new_full (GSK_TYPE_VULKAN_TEXT_PIPELINE, layout, shader_name, render_pass,
+ return gsk_vulkan_pipeline_new_full (GSK_TYPE_VULKAN_TEXT_PIPELINE, context, layout, shader_name, render_pass,
VK_BLEND_FACTOR_SRC_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA);
}
G_DECLARE_FINAL_TYPE (GskVulkanTextPipeline, gsk_vulkan_text_pipeline, GSK, VULKAN_TEXT_PIPELINE, GskVulkanPipeline)
-GskVulkanPipeline * gsk_vulkan_text_pipeline_new (GskVulkanPipelineLayout * layout,
- const char *shader_name,
- VkRenderPass render_pass);
+GskVulkanPipeline * gsk_vulkan_text_pipeline_new (GdkVulkanContext *context,
+ VkPipelineLayout layout,
+ const char *shader_name,
+ VkRenderPass render_pass);
gsize gsk_vulkan_text_pipeline_count_vertex_data (GskVulkanTextPipeline *pipeline,
int num_instances);